package br.com.vagacerta.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.vagacerta.modelo.Cidade;
import br.com.vagacerta.modelo.Estado;

@Repository
public class CidadeDAO {

	private Connection connection;
	private EstadoDAO estadoDAO;

	@Autowired
	public CidadeDAO(DataSource dataSource, EstadoDAO estadoDAO) {
		try {
			this.connection = dataSource.getConnection();
			this.estadoDAO = estadoDAO;
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public boolean existeCidade(String nomeCidade) {

		try {
			Boolean existeCidade = false;

			String sql = "SELECT IF((SELECT count(*) FROM cidade WHERE UPPER(CIDADE) = ?) = 1,'true','false') AS 'EXISTE_CIDADE'";

			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setString(1, nomeCidade.toUpperCase());
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				existeCidade = Boolean.valueOf(rs.getString("EXISTE_CIDADE"));
			}

			rs.close();
			stmt.close();

			return existeCidade;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public Cidade consultaCidadePorNome(String nomeCidade, Estado objEstado) {

		try {

			Cidade cidade = new Cidade();

			String sql2 = "SELECT COD_CIDADE, CIDADE, COD_ESTADO FROM CIDADE WHERE UPPER(CIDADE) = ? ORDER BY COD_CIDADE ASC LIMIT 1";
			PreparedStatement stmt2;
			stmt2 = connection.prepareStatement(sql2);

			stmt2.setString(1, nomeCidade.toUpperCase());

			ResultSet rs2 = stmt2.executeQuery();

			while (rs2.next()) {
				cidade.setCidade(rs2.getString("CIDADE"));
				cidade.setCodigoCidade(rs2.getLong("COD_CIDADE"));
				cidade.setEstado(objEstado);
			}

			rs2.close();
			stmt2.close();

			return cidade;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	public void adicionaCidade(String cidade, long codigoEstado) {

		try {

			String sql = "INSERT INTO CIDADE (CIDADE, COD_ESTADO) VALUES (?, ?)";
			PreparedStatement stmt = connection.prepareStatement(sql);

			stmt.setString(1, cidade.toUpperCase());
			stmt.setLong(2, codigoEstado);
			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			throw new RuntimeException(e);

		}

	}

	public Cidade consultaCidadePorId(long idCidade) {

		try {

			String sql = "SELECT * FROM CIDADE WHERE COD_CIDADE = ? LIMIT 1";

			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setLong(1, idCidade);
			
			ResultSet rs = stmt.executeQuery();
			Cidade cidade = new Cidade();

			while (rs.next()) {
				cidade.setCodigoCidade(rs.getLong("COD_CIDADE"));
				cidade.setCidade(rs.getString("CIDADE"));
				cidade.setEstado(estadoDAO.consultaEstadoPorId(rs.getLong("COD_ESTADO")));
			}

			rs.close();
			stmt.close();
			
			return cidade;

		} catch (SQLException e) {
			throw new RuntimeException(e);

		}

	}
}
